package sc.senai.br.avaliacao;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public final class RodadaImpl extends UnicastRemoteObject implements Runnable, Rodada {
    private final Juiz juiz;
    private final int rodada;
    private final Map<String, Jogadas> jogadas;
    private String vencedor;
    private int estado = -1;
    private final int TEMPO_PARTIDA = 2000;

    public RodadaImpl(Campeonato campeonato, Juiz juiz, int rodada) throws RemoteException {
        this.juiz = juiz;
        this.rodada = rodada;
        this.jogadas = new ConcurrentHashMap();
    }

    public synchronized void registraJogada(String registro, Jogadas jogada) throws RemoteException {
        if (this.estado == 1) {
            throw new RemoteException("Partida finalizada!");
        }
        if (this.jogadas.containsKey(registro)) {
            throw new RemoteException("Jogador já registrou a jogada para esta rodada!");
        }
        this.jogadas.put(registro, jogada);
    }

    public int getRodada() throws RemoteException {
        return this.rodada;
    }

    public boolean isFinalizada() {
        return this.vencedor != null;
    }

    public String getVencedor() throws RemoteException {
        return this.vencedor;
    }

    public Collection<Jogadas> getJogadas() throws RemoteException {
        return this.jogadas.values();
    }

    public synchronized void inicia() throws Exception {
        switch (this.estado) {
        case -1:
            new Thread(this).start();
            break;
        case 0:
            throw new Exception("Partida já iniciada!");
        case 1:
            throw new Exception("Partida finalizada!");
        default:
            throw new Exception("Partida não pode ser iniciada!");
        }
    }

    public void run() {
        if (this.estado != 1) {
            try {
                Thread.sleep(2000L);
            } catch (InterruptedException ex) {
                System.out.println("ERRO: A rodada foi interrompida!");
                System.out.println("ERRO: " + ex);
            }
            this.estado = 1;
            try {
                this.vencedor = this.juiz.apuraResultado(this.jogadas);
            } catch (RemoteException ex) {
                System.out.println("ERRO: " + ex);
            }
        }
    }
}